package org.osada.main;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.osada.main.Button;
import org.osada.main.Mapa;
import org.osada.main.ObiektMapy;

import java.util.Random;
import org.newdawn.slick.geom.Rectangle;

public class KontrolerGraficzny {

	int mouseX, mouseY;			//zmienne zachowujace ostatni punkt kursora myszy
	
	Image main = null;			//deklaracje obrazow interfejsu
	Image panel_mid = null;
	Image panel_bot = null;
	Image button1_img = null;
	Image button2_img = null;
	Image button3_img = null;
	
	int map_moving=0;			//pomocnicza zmienna do poruszania sie po mapie za pomoca prawego przycisku myszy
	
	Image Minimap_background = null;	//tlo minimapy
	Rectangle minimap_rect = null;		//kwadrat na minimapie
	Button minimap_button = null;		//przycisk do przenoszenia sie na mapie
								//przyciski glowne po prawej stronie
	Button Button1 = null;		//przycisk buduj		
	Button Button2 = null;		//przycisk informacji o grze
	Button Button3 = null;		//przycisk opcji
	
		
	//tymczasowe deklaracje - test
	Mapa mapa;							//tworzenie obiektu mapy
	int przesuniecieX, przesuniecieY;	//przesuniecie wzgledem punktu 0,0
	Image tile = null;					//tymczasowy obiekt obrazka
	int buttonClicked=0;				//zmienna do obslugi przyciskow
	Random generator = new Random();	//generator liczb losowych
	//koniec tymczasowych deklaracji
	
	public void init(GameContainer container) throws SlickException
	{
		//tymczasowy kod - tworzenie mapy - test
		tile = new Image("/Images/Tiles/blank.png");		//poczatkowe ustawienie obrazka pomocniczego
		mapa = new Mapa(144,144);							//stworzenie nowej mapy, rozmiar minimalny - 26x24, maksymalny - 144x144
		przesuniecieX=0;									//wyzerowanie przesuniecia	
		przesuniecieY=0;
		ObiektMapy obiekt;									//tworzenie obiektu mapy
		for (int x=0;x<mapa.rozmiarX;x++){					//dla kazdego punktu mapy...
			for (int y=0;y<mapa.rozmiarY;y++){
				obiekt = new ObiektMapy();					//utworz nowy obiekt				
				obiekt.obraz = new Image("/Images/Tiles/grass.png");	//ustaw trawe jako obrazek
				obiekt.rozmiarX=1;										//rozmiar 1x1 kratka
				obiekt.rozmiarY=1;
				obiekt.polozenieX=x;									//polozenie (x,y)
				obiekt.polozenieY=y;
								
															//losowe generowanie drzew
				if (generator.nextInt(100)<10) obiekt.obraz = new Image("/Images/Tiles/tree1.png");		
				
				mapa.setTile(x,y,obiekt);					//wstawienie obiektu na mape
			}
		}
															//tworzenie prostokata na minimape wielkosc = ilosc kratek*skala minimapy
		minimap_rect = new Rectangle(854,27,26*mapa.minimap_scale,24*mapa.minimap_scale);
		

		//koniec
		
		
		
		main = new Image("/Images/UI/main.png");				//ustawianie grafiki interfejsu
		panel_mid = new Image("/Images/UI/panel_rect.png");
		panel_bot = new Image("/Images/UI/panel_square.png");
		
		Minimap_background = new Image("/Images/UI/minimap.png");	
		minimap_button = new Button(854,26,144,144);	//ustawienie przycisku na minimapie
		
		button1_img = new Image("/Images/UI/button1.png");		//grafiki przyciskow
		button2_img = new Image("/Images/UI/button2.png");
		button3_img = new Image("/Images/UI/button3.png");

		Button1 = new Button(831,195,button1_img);				//tworzenie przyciskow
		Button2 = new Button(895,195,button2_img);
		Button3 = new Button(958,195,button1_img);
	}
	
	
	public void update(GameContainer container, int delta) throws SlickException
	{
		Input input = container.getInput();		//obiekt klasy input obslugujacy klawiature i mysz
		buttonClicked=0;						//zresetowanie pomocniczej zmiennej do obslugi przyciskow
												//obsluga przesuwania widoku przy wcisnieciu prawego przycisku myszy
        if(input.isMouseButtonDown(input.MOUSE_RIGHT_BUTTON) && input.getMouseX()>7 && input.getMouseY()>7 && input.getMouseX()<825 && input.getMouseY()<762  )	
        {
        	map_moving=1;	//ustawienie pomocniczej zmiennej
        }
        else{
        	map_moving=0;	//zerowanie zmiennej
        }
                
        if (map_moving==1){	//obsluga przesuwania mapy
        	przesuniecieX+=(mouseX-input.getMouseX());	//dodanie przesuniecia kursora w poziomie do zmiennej przesuniecieX
        	przesuniecieY+=(mouseY-input.getMouseY());	//dodanie przesuniecia kursora w pionie do zmiennej przesuniecieY
        	if (przesuniecieX<0) przesuniecieX=0;		//sprawdzanie czy przesuniecie miesci sie w granicach mapy
        	if (przesuniecieY<0) przesuniecieY=0;
        	if (przesuniecieX>32*mapa.rozmiarX-818) przesuniecieX=32*mapa.rozmiarX-818;		//korekta przesuniecia
        	if (przesuniecieY>32*mapa.rozmiarY-754) przesuniecieY=32*mapa.rozmiarY-754;
        												//ustawienie prostokata na minimapie z uwzglednieniem skali - przesuniecieX/32 - ilosc kratek na mapie o jaka przesuniety jest widok
        	minimap_rect.setLocation(854+(przesuniecieX/32)*mapa.minimap_scale,27+(przesuniecieY/32)*mapa.minimap_scale);
        }
        
        if(input.isMousePressed(input.MOUSE_LEFT_BUTTON))		//obsluga przyciskow (lewe klikniecie myszy)
        {
        	if (Button1.isMouseOver(input.getMouseX(), input.getMouseY())) buttonClicked=1;				//sprawdzanie ktory przycisk jest wcisniety
        	else if (Button2.isMouseOver(input.getMouseX(), input.getMouseY())) buttonClicked=2;
        	else if (Button3.isMouseOver(input.getMouseX(), input.getMouseY())) buttonClicked=3;
        	else if (minimap_button.isMouseOver(input.getMouseX(), input.getMouseY())) buttonClicked=4;
        }   
        
        if (buttonClicked>0){								//oblsluga klikniecia
        	switch(buttonClicked){
        	case 1:
        		System.out.println("Button "+buttonClicked);
        		break;
        	case 2:
        		System.out.println("Button "+buttonClicked);
        		break;
        	case 3:
        		System.out.println("Button "+buttonClicked);
        		break;
        	case 4:											//przycisk minimapy - obsluga przemieszczenia po kliknieciu
        		przesuniecieX=32*((input.getMouseX()-854-13*mapa.minimap_scale)/mapa.minimap_scale);	//obliczenie przesuniecia uwzglednieniem skali - -13 (dla X)lub-12 (dla Y)
        		przesuniecieY=32*((input.getMouseY()-26-12*mapa.minimap_scale)/mapa.minimap_scale);		// powoduje umieszczenie SRODKA mapy we wskazanym miejscu
            	if (przesuniecieX<0) przesuniecieX=0;													//sprawdzanie czy przesuniecie miesci sie w granicach mapy
            	if (przesuniecieY<0) przesuniecieY=0;
            	if (przesuniecieX>32*mapa.rozmiarX-818) przesuniecieX=32*mapa.rozmiarX-818;				//korekta przesuniecia
            	if (przesuniecieY>32*mapa.rozmiarY-754) przesuniecieY=32*mapa.rozmiarY-754;   
            									//ustawienie prostokata na minimapie z uwzglednieniem skali - przesuniecieX/32 - ilosc kratek na mapie o jaka przesuniety jest widok
            	minimap_rect.setLocation(854+(przesuniecieX/32)*mapa.minimap_scale,27+(przesuniecieY/32)*mapa.minimap_scale);
        		break;
        	}
        }
        
        
		mouseX=input.getMouseX();		//zapamietanie pozycji kursora myszy
		mouseY=input.getMouseY();
	}
	
	   public void render(GameContainer container, Graphics g) throws SlickException
	    {	
	    	//wyswietlanie obiektow mapy
	    	
			ObiektMapy trawa = new ObiektMapy();	//twirzenie obiektu bedacego trawa
			trawa.obraz = new Image("/Images/Tiles/grass.png");		//ustawienie obrazka
			trawa.rozmiarX=1;										//i rozmiaru
			trawa.rozmiarY=1;
	    	
	    	for (int x=przesuniecieX/32;x<27+przesuniecieX/32;x++){					//petla rysujaca obiekty mapy, 7 to przesuniecie w pikselach ze wzgledu na interfejs
	    		for (int y=przesuniecieY/32;y<25+przesuniecieY/32;y++){
	    			trawa.obraz.draw(32*x-przesuniecieX+7, 32*y-przesuniecieY+7);						//rysowanie trawy
	    			mapa.tablicaObiektow[x][y].obraz.draw(32*x-przesuniecieX+7, 32*y-przesuniecieY+7);	//rysowanie obiektu mapy
	    			if (y==mapa.rozmiarY-1) break;					//konczenie petli gdy znajdujemy sie przy granicy mapy - zapobiega wyjatkowi
	    		}	
	    		if (x==mapa.rozmiarX-1) break;						//konczenie petli gdy znajdujemy sie przy granicy mapy - zapobiega wyjatkowi
	    	}
	    	
	    	
	    	//wyswietlanie interfejsu
	    	main.draw(0, 0);							//wyswietlanie grafiki interfejsu
	    	panel_mid.draw(831, 227);
	    	panel_bot.draw(831, 582);
	    	button1_img.draw(831, 195);					//wyswietlanie grafiki przyciskow
	    	button2_img.draw(895, 195);
	    	button3_img.draw(958, 195);
	    	
	    	//wyswietlanie minimapy
	    	Minimap_background.draw(854,26);			//wyswietlanie tla minimapy
	    	for (int x=0;x<mapa.rozmiarX;x++){			//wyswietlanie minimapy, 2 petle dla (X,Y) oraz 2 petle dla skali minimapy
	    		for (int y=0;y<mapa.rozmiarY;y++){
	    			for (int i=0;i<mapa.minimap_scale;i++)
	    				for (int j=0;j<mapa.minimap_scale;j++)
	    				mapa.Minimap[x][y].draw(854+x*mapa.minimap_scale+i,26+y*mapa.minimap_scale+j);		//wyswietlanie punktu minimapy
	    		}
	    	}
	    	
	    	g.draw(minimap_rect);						//rysowanie prostokata na minimaoie	    
	    }	
}
